/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   main.cpp
 * Author: root
 *
 * Created on 2018年2月10日, 上午5:05
 */

#include "stdax.h"

#include "TraderSpi.h"
#include "MdSpi.h"

//HANDLE g_hEvent = CreateEvent(NULL, true, false, NULL);

sem_t sem     ; // Global Variable

/*
//可以使用 PTHREAD_COND_INITIALIZER 常量静态地对 pthread_cond_t 类型的条件变量进行初始化，
//也可以使用 pthread_condattr_init() 对其进行初始化，
//这个函数会对与这个条件变量关联在一起的属性进行初始化。
pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
*/
// UserApi对象
CThostFtdcTraderApi* pUserApi;
CThostFtdcMdApi* pMdApi;

// 配置参数
//char  FRONT_ADDR[] = "tcp://asp-sim2-front1.financial-trading-platform.com:26205";		// 前置地址
//TThostFtdcBrokerIDType	BROKER_ID = "2030";				// 经纪公司代码
//TThostFtdcInvestorIDType INVESTOR_ID = "00069";			// 投资者代码
//TThostFtdcPasswordType  PASSWORD = "888888";			// 用户密码
/*
char  FRONT_ADDR[] = "tcp://180.168.212.79:31205";		// 前置地址
TThostFtdcBrokerIDType	BROKER_ID = "8000";				// 经纪公司代码
TThostFtdcInvestorIDType INVESTOR_ID = "41003401";			// 投资者代码
TThostFtdcPasswordType  PASSWORD = "HelloHello";			// 用户密码
*/

char  FRONT_ADDR[] = "tcp://180.166.103.34:41205";		// 前置地址
TThostFtdcBrokerIDType	BROKER_ID = "6666";				// 经纪公司代码
TThostFtdcInvestorIDType INVESTOR_ID = "66603100";			// 投资者代码
TThostFtdcPasswordType  PASSWORD = "~123";			// 用户密码

char *g_pInstrumentID[] = {"TF1706", "zn1705", "cs1801", "CF705"}; // 行情合约代码列表，中、上、大、郑交易所各选一种  
int instrumentNum = 4;
TThostFtdcInstrumentIDType INSTRUMENT_ID = "IF1406";	// 合约代码
TThostFtdcDirectionType	DIRECTION = THOST_FTDC_D_Sell;	// 买卖方向
TThostFtdcPriceType	LIMIT_PRICE = 2388.50;				// 价格

// 请求编号
int iRequestID = 0;
/*
 * 
 */
int main(int argc, char** argv) {
    // Thread 1
    int   retCode ;
    // Initialize event semaphore
    retCode = sem_init(
                       &sem,   // handle to the event semaphore
                       0,     // not shared
                       0);    // initially set to non signaled state
    #if 1
    /*原有代码*/
            pMdApi = CThostFtdcMdApi::CreateFtdcMdApi();
            CThostFtdcMdSpi* pMdSpi = new CMdSpi();
            pMdApi->RegisterSpi(pMdSpi);			// 注册事件类				// 注册私有流
            pMdApi->RegisterFront(FRONT_ADDR);							// connect
            pMdApi->Init();
            // 初始化UserApi
            pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi();			// 创建UserApi
            CTraderSpi* pUserSpi = new CTraderSpi();
            pUserApi->RegisterSpi((CThostFtdcTraderSpi*)pUserSpi);			// 注册事件类
            pUserApi->SubscribePublicTopic(THOST_TERT_RESTART);					// 注册公有流
            pUserApi->SubscribePrivateTopic(THOST_TERT_RESTART);					// 注册私有流
            pUserApi->RegisterFront(FRONT_ADDR);							// connect
            pUserApi->Init();

            pUserApi->Join();
    //	pUserApi->Release();
    #else
            // 产生一个CThostFtdcTraderApi实例
                    CThostFtdcTraderApi *pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi();
            // 产生一个事件处理的实例
            //CSimpleHandler sh(pUserApi);
            CTraderSpi* pUserSpi = new CTraderSpi();
            // 注册一事件处理的实例
            //pUserApi->RegisterSpi(&sh);
            pUserApi->RegisterSpi((CThostFtdcTraderSpi*)pUserSpi);			// 注册事件类
            // 订阅私有流
            // TERT_RESTART:从本交易日开始重传
            // TERT_RESUME:从上次收到的续传
            // TERT_QUICK:只传送登录后私有流的内容
            pUserApi->SubscribePrivateTopic(TERT_RESUME);
            // 订阅公共流
            // TERT_RESTART:从本交易日开始重传
            // TERT_RESUME:从上次收到的续传
            // TERT_QUICK:只传送登录后公共流的内容
            pUserApi->SubscribePublicTopic(TERT_RESUME);
            // 设置交易托管系统服务的地址，可以注册多个地址备用
            //pUserApi->RegisterFront("tcp://172.16.0.31:57205");
            pUserApi->RegisterFront(FRONT_ADDR);							// connect
            // 使客户端开始与后台服务建立连接
            pUserApi->Init();
            // 客户端等待报单操作完成
    //	WaitForSingleObject(g_hEvent, INFINITE);

    // Wait for the event be signaled
    retCode = sem_wait(
                       &sem); // event semaphore handle
                              // Indefinite wait
    /*
    pthread_cond_wait(&condvar, &mutex);
    */
            // 释放API实例
            pUserApi->Release();
            //return 0;
    #endif
    return 0;
}

